#include "I2C.h"
#include <REGX51.H>
#include "delay.h"
#include  <intrins.h>


sbit SCL=P2^1;
sbit SDA=P2^0;
/****************************************************************************
*    函数原型: void IIC_start(void);
*    功    能: 提供I2C总线工作时序中的起始位。                             
****************************************************************************/
void I2C_start(void)
{    
	SDA=HIGH;
	Delaynus(5);
	SCL = HIGH;
	Delaynus(5);
	SDA = LOW ;
	Delaynus(5);
}
/****************************************************************************
*    函数原型: void IIC_stop(void);
*    功    能: 提供I2C总线工作时序中的停止位。
****************************************************************************/
void I2C_stop( void ) {
	SCL = LOW ;
	Delaynus(5);
	SDA = LOW ;
	Delaynus(5);
	SCL = HIGH ;
	Delaynus(5);
	SDA = HIGH ;
	Delaynus(5);
 }
/****************************************************************************
*    函数原型: void IIC_init(void);
*    功    能: I2C总线初始化。在main()函数中应首先调用本函数, 然后再调用
*              其它函数。
****************************************************************************/
void I2C_init( void ) {
	SCL = HIGH ;
	_nop_();
	SDA = HIGH;
	Delaynus(5);
}
/********************************************************************
*    函数原型: void IIC_SendByte(unsigned 	char Data)
*    功    能: 主机向I2C总线上发送1字节数据，可以是从机的地址也可是
               发给从机的数据
********************************************************************/
void I2C_SendByte(unsigned 	char Data)
{
   unsigned char  i=0;
   for(i=0;i<8;i++)
   {
	 SCL=LOW;
	 Delaynus(5);
	 SDA=(Data&0x80)>>7;
	 Delaynus(5);
	 SCL=HIGH;
	 Delaynus(5);
	 Data<<=1;
   }
}
/********************************************************************
*    函数原型: void IIC_RcvByte(unsigned char Data)
*    功    能: 主机向I2C总线上发送1字节数据，可以是从机的地址也可是
*              发给从机的数据
********************************************************************/
unsigned char I2C_RcvByte(void)
{
   unsigned char i=0;
   unsigned char Data;
   for(i=0;i<8;i++)
   {
	 Data<<=1;
	 SCL=LOW;
	 Delaynus(5);
	 SCL=HIGH;
	 Delaynus(5);
	 Data=Data|SDA;
   }
   return Data;
}
/********************************************************************
*    函数原型: void Ack(void)
*    功    能: 数据接收方发出的应答信号，这里指MCU接受数据后对从器件
               的回应
********************************************************************/
void I2C_Ack(void)
{
	SCL=LOW;
	Delaynus(5);
	SDA=LOW;
	Delaynus(5);
	SCL=HIGH;
	Delaynus(5);
}
/********************************************************************
*    函数原型: void NoAck(void)
*    功    能: 数据接收方发出的非应答信号，这里指MCU接受数据后对从器件
               的回应
********************************************************************/
void I2C_NoAck(void)
{
	SCL=LOW;
	Delaynus(5);
	SDA=HIGH;
	Delaynus(5);
	SCL=HIGH;
	Delaynus(5);
}
/********************************************************************
*    函数原型: void CheckAck(void)
*    功    能: 数据接发送接受应答信号，这里指MCU发送数据后检测从器件
               是否回应
********************************************************************/
bit I2C_CheckAck(void)
{
	bit RcvACK=nack;
	unsigned char i=0;
	SCL=LOW;
	Delaynus(5);
	SDA=HIGH;
	Delaynus(5);
	SCL=HIGH;
	while(RcvACK==nack&&i<255)
	{
	RcvACK=SDA;
	i++;
	}
	return RcvACK;
}
/********************************************************************
*    函数原型: void I2C_Send7bitAddr(unsigned char ADDRESS,unsigned char Direction)
*    功    能: 主机发送7位地址选中从器件
*    备    注：ADDRESS：由7位器件地址,最低位为0，高7位是器件地址
*              Direction：下一个字节的传输方向
                           实参数：I2C_WR          写入
						           I2C_RD          读取
********************************************************************/
void I2C_Send7bitAddr(unsigned char ADDRESS,unsigned char Direction)
{
     ADDRESS=ADDRESS|Direction;
	 I2C_SendByte(ADDRESS);
}




